/*Version 1.0*/
#include <string.h>
#include <stdlib.h>
#include "Boite_Saisie_Outils.h"

/*Les fonctions internes permettent d'appeler les foonctions dessins les formes 
  une fois les structures des outils remplies*/
static void AppelDessinerRec(GtkButton *button, gpointer user_data)
{
  Rectangle * r = (Rectangle*)user_data;

  dessins = clutter_cairo_texture_new (r->dimX,r->dimY);
  /*On dessine la forme sur l'ecran*/
  clutter_container_add_actor (CLUTTER_CONTAINER (stage), dessins);
  clutter_actor_add_constraint (dessins, clutter_bind_constraint_new (stage, CLUTTER_BIND_SIZE, 0));
  clutter_cairo_texture_set_auto_resize (CLUTTER_CAIRO_TEXTURE (dessins), TRUE);

  g_signal_connect(dessins, "draw", G_CALLBACK (DessinerRectangle),(Rectangle*)r);
}

static void AppelDessinerCar(GtkButton *button, gpointer user_data)
{
  Carre * c = (Carre*)user_data;

  dessins = clutter_cairo_texture_new (c->dim,c->dim);
  clutter_container_add_actor (CLUTTER_CONTAINER (stage), dessins);
  clutter_actor_add_constraint (dessins, clutter_bind_constraint_new (stage, CLUTTER_BIND_SIZE, 0));
  clutter_cairo_texture_set_auto_resize (CLUTTER_CAIRO_TEXTURE (dessins), TRUE);

  g_signal_connect(dessins, "draw", G_CALLBACK (DessinerCarre),(Carre*)c);
}

static void AppelDessinerCercle(GtkButton *button, gpointer user_data)
{
  Cercle * c = (Cercle*)user_data;
  
  dessins = clutter_cairo_texture_new (c->rayon*2,c->rayon*2);
  clutter_container_add_actor (CLUTTER_CONTAINER (stage), dessins);
  clutter_actor_add_constraint (dessins, clutter_bind_constraint_new (stage, CLUTTER_BIND_SIZE, 0));
  clutter_cairo_texture_set_auto_resize (CLUTTER_CAIRO_TEXTURE (dessins), TRUE);

  g_signal_connect(dessins, "draw", G_CALLBACK (DessinerCercle),(Cercle*)c);
}

static void AppelDessinerPlume(GtkButton *button, gpointer user_data)
{
  Plume * p=(Plume*)user_data;

  dessins = clutter_cairo_texture_new (p->dimX,p->dimY);
  clutter_container_add_actor (CLUTTER_CONTAINER (stage), dessins);
  clutter_actor_add_constraint (dessins, clutter_bind_constraint_new (stage, CLUTTER_BIND_SIZE, 0));
  clutter_cairo_texture_set_auto_resize (CLUTTER_CAIRO_TEXTURE (dessins), TRUE);

  g_signal_connect(dessins, "draw", G_CALLBACK (DessinerPlume),(Plume*)p);
}

/*Fonction qui appele les differents champs*/
/*pour saisir les parametres de Rectangle*/
void boite_saisie_rectangle(Rectangle * rec)
{
  /*Note pour les structures : On alloue les structures dans le tas pour le passage de parametre
    dans les fonctions G_CALLBACK sinon cela ne fonctionne pas. Par contre nous n'avons
    pas trouve de solution pour liberer cette espace alloue sans faire planter l'application avec des erreurs
    de segmentation*/

  champ_rectangle * cr=malloc(sizeof(champ_rectangle));

  /*Declaration de la fenetre et de la boite qui contient les champs de structure*/
  GtkWidget * pWindow,* pVBox;
  
  /*Champs de saisie des parametres*/
  GtkWidget *champs_coordoRecX,*champs_coordoRecY,*champs_dimX,*champs_dimY,*champs_epaisseur_contour,*champs_couleur_contourR;
  GtkWidget *champs_couleur_contourG,*champs_couleur_contourB,*champs_couleur_fondR,*champs_couleur_fondG,*champs_couleur_fondB;

  /*Bouton pour valider la saisie et declaration des etiquettes*/
  GtkWidget * Button_ok;
  GtkWidget *pLabel1,*pLabel2,*pLabel3,*pLabel4,*pLabel5,*pLabel6,*pLabel7,*pLabel8,*pLabel9,
    *pLabel10,*pLabel11;

  /*Affichage de la fenetre*/
  pWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  gtk_window_set_title(GTK_WINDOW(pWindow),"Parametrage Rectangle");
  gtk_window_set_default_size(GTK_WINDOW(pWindow), 150, 100);
  pVBox = gtk_box_new(TRUE, 0);
  gtk_container_add(GTK_CONTAINER(pWindow), pVBox);
 
  pLabel1 = gtk_label_new("Coordonnees en X : en double");
  pLabel2 = gtk_label_new("Coordonnees en Y : en double");
  pLabel3 = gtk_label_new("Longueur : en double");
  pLabel4 = gtk_label_new("Largeur : en double");
  pLabel5 = gtk_label_new("Epaisseur contour : en double");	
  pLabel6 = gtk_label_new("Couleur contour R : un double");
  pLabel7 = gtk_label_new("Couleur contour G : un double");
  pLabel8 = gtk_label_new("Couleur contour B : un double");
  pLabel9 = gtk_label_new("Couleur fond R : un double");
  pLabel10 = gtk_label_new("Couleur fond G : un double");
  pLabel11 = gtk_label_new("Couleur fond B : un double");
   
  champs_coordoRecX = gtk_entry_new();
  champs_coordoRecY = gtk_entry_new();
  champs_dimX = gtk_entry_new();
  champs_dimY = gtk_entry_new();
  champs_epaisseur_contour = gtk_entry_new();
  champs_couleur_contourR = gtk_entry_new();
  champs_couleur_contourG = gtk_entry_new();
  champs_couleur_contourB = gtk_entry_new();
  champs_couleur_fondR = gtk_entry_new();
  champs_couleur_fondG = gtk_entry_new();
  champs_couleur_fondB = gtk_entry_new();
  
  /*Inclusion des champs de saisie dans la boite*/
  gtk_box_pack_start(GTK_BOX(pVBox),pLabel1, TRUE, FALSE, 0);
  gtk_box_pack_start(GTK_BOX(pVBox),champs_coordoRecX, TRUE, FALSE, 0);
  
  gtk_box_pack_start(GTK_BOX(pVBox),pLabel2, TRUE, FALSE, 0);
  gtk_box_pack_start(GTK_BOX(pVBox),champs_coordoRecY, TRUE, FALSE, 0);
  
  gtk_box_pack_start(GTK_BOX(pVBox),pLabel3, TRUE, FALSE, 0);
  gtk_box_pack_start(GTK_BOX(pVBox),champs_dimX, TRUE, FALSE, 0);

  gtk_box_pack_start(GTK_BOX(pVBox),pLabel4, TRUE, FALSE, 0);
  gtk_box_pack_start(GTK_BOX(pVBox),champs_dimY, TRUE, FALSE, 0);

  gtk_box_pack_start(GTK_BOX(pVBox),pLabel5, TRUE, FALSE, 0);
  gtk_box_pack_start(GTK_BOX(pVBox),champs_epaisseur_contour, TRUE, FALSE, 0);

  gtk_box_pack_start(GTK_BOX(pVBox),pLabel6, TRUE, FALSE, 0);
  gtk_box_pack_start(GTK_BOX(pVBox),champs_couleur_contourR, TRUE, FALSE, 0);

  gtk_box_pack_start(GTK_BOX(pVBox),pLabel7, TRUE, FALSE, 0);
  gtk_box_pack_start(GTK_BOX(pVBox),champs_couleur_contourG, TRUE, FALSE, 0);

  gtk_box_pack_start(GTK_BOX(pVBox),pLabel8, TRUE, FALSE, 0);
  gtk_box_pack_start(GTK_BOX(pVBox),champs_couleur_contourB, TRUE, FALSE, 0);

  gtk_box_pack_start(GTK_BOX(pVBox),pLabel9, TRUE, FALSE, 0);
  gtk_box_pack_start(GTK_BOX(pVBox),champs_couleur_fondR, TRUE, FALSE, 0);

  gtk_box_pack_start(GTK_BOX(pVBox),pLabel10, TRUE, FALSE, 0);
  gtk_box_pack_start(GTK_BOX(pVBox),champs_couleur_fondG, TRUE, FALSE, 0);
  
  gtk_box_pack_start(GTK_BOX(pVBox),pLabel11, TRUE, FALSE, 0);
  gtk_box_pack_start(GTK_BOX(pVBox),champs_couleur_fondB, TRUE, FALSE, 0);

  Button_ok = gtk_button_new_with_label("Valider");
  gtk_box_pack_start(GTK_BOX(pVBox),Button_ok, TRUE, FALSE, 0);

  /*****************************************************************/
  cr->r = rec;
  cr->Box = pVBox;
  
  /*Appel de la fonction qui remplit la structure marqueur*/
  g_signal_connect(G_OBJECT(Button_ok),"clicked",G_CALLBACK(RemplirStructureRectangle),(champ_rectangle*)cr);
  g_signal_connect(G_OBJECT(Button_ok),"clicked",G_CALLBACK(AppelDessinerRec),(Rectangle*)cr->r);
  
  gtk_widget_show_all(pWindow);
  
}

/*Fonction qui remplit la structure marqueur qui contient les*/
/*les parametres de la structure rectangle*/
void RemplirStructureRectangle(GtkWidget *pButton,gpointer data)
{
  GtkWidget *champs;
  GList *list;/*liste doublement chainee de gtk*/
  const gchar *texte_champs;
  Rectangle * rec;

  champ_rectangle * cr=(champ_rectangle*)data;
  rec=cr->r;

  /* Recuperation de la liste des elements que contient la GtkVBox */
  list = gtk_container_get_children(GTK_CONTAINER((GtkWidget*)cr->Box));
  
  /*On recupere pour le 1er champ Coordonnes en X)*/
  list = g_list_next(list);
  champs = GTK_WIDGET(list->data);
  texte_champs = gtk_entry_get_text(GTK_ENTRY(champs));

  /*On convertit la chaine en double */
  rec->coordoRec.x=atof(texte_champs);

  /*On continue pour les autres champs 2 Coordonnes en Y) */
  list = g_list_next(list);/*Le premier g_list_next correspond au label et non au champ de saisie*/
  list = g_list_next(list);
  champs = GTK_WIDGET(list->data);
  texte_champs = gtk_entry_get_text(GTK_ENTRY(champs));
  rec->coordoRec.y=atof(texte_champs);
  
  /*On continue pour les autres champs 3 Dimension en X du rectangle) */
  list = g_list_next(list);
  list = g_list_next(list);
  champs = GTK_WIDGET(list->data);
  texte_champs = gtk_entry_get_text(GTK_ENTRY(champs));
  rec->dimX=atof(texte_champs);

  /*On continue pour les autres champs 4 Dimension en Y du rectangle) */
  list = g_list_next(list);
  list = g_list_next(list);
  champs = GTK_WIDGET(list->data);
  texte_champs = gtk_entry_get_text(GTK_ENTRY(champs));
  rec->dimY=atof(texte_champs);
	 
  /*On continue pour les autres champs 5 Epaisseur du contour*/
  list = g_list_next(list);
  list = g_list_next(list);
  champs = GTK_WIDGET(list->data);
  texte_champs = gtk_entry_get_text(GTK_ENTRY(champs));
  rec->epaisseur_contour=atof(texte_champs);
  
  /*On continue pour les champs Couleur contour et couleur fond du rectangle
   couleur contour*/
  list = g_list_next(list);
  list = g_list_next(list);
  champs = GTK_WIDGET(list->data);
  texte_champs = gtk_entry_get_text(GTK_ENTRY(champs));
  rec->contour.r=atof(texte_champs);
   
  list = g_list_next(list);
  list = g_list_next(list);
  champs = GTK_WIDGET(list->data);
  texte_champs = gtk_entry_get_text(GTK_ENTRY(champs));
  rec->contour.g=atof(texte_champs);
  
  list = g_list_next(list);
  list = g_list_next(list);
  champs = GTK_WIDGET(list->data);
  texte_champs = gtk_entry_get_text(GTK_ENTRY(champs));
  rec->contour.b=atof(texte_champs);

  /*Couleur du fond*/
  list = g_list_next(list);
  list = g_list_next(list);
  champs = GTK_WIDGET(list->data);
  texte_champs = gtk_entry_get_text(GTK_ENTRY(champs));
  rec->fond.r=atof(texte_champs);

  list = g_list_next(list);
  list = g_list_next(list);
  champs = GTK_WIDGET(list->data);
  texte_champs = gtk_entry_get_text(GTK_ENTRY(champs));
  rec->fond.g=atof(texte_champs);

  list = g_list_next(list);
  list = g_list_next(list);
  champs = GTK_WIDGET(list->data);
  texte_champs = gtk_entry_get_text(GTK_ENTRY(champs));
  rec->fond.b=atof(texte_champs);
  
  g_list_free(list); /*On libere la liste*/
}

/*Saisie des parametres de la structure plume
 Note : Pour la structure plume, initialement il etait prevu que
 l'utilisateur puisse choisir le nombre de points de la forme
 et que les champs apparaissent dynamiquement pour saisir les coordonnees de ces points.
 Mais cela n'a pas fonctionne, du coup nous avons limite le nombre de points d'encrage a 3
 Le fonction de l'outils plume ressemble au fonctionnement de la plume de bezier*/

void boite_saisie_plume(Plume * pl)
{
  champ_plume * cr=malloc(sizeof(champ_plume));

  /*Declaration de la fenetre et de la boite*/
  GtkWidget * pWindow,* pVBox;

  /*Champs de saisie des parametres*/
  /*Coordonnees de la forme*/
  GtkWidget *champs_coordoPlumeX,*champs_coordoPlumeY;
 
  /*Coordonnes des points d'encrage*/
  GtkWidget *champs_coordoPlumeX3_1,*champs_coordoPlumeY3_2,*champs_coordoPlumeX3_3,*champs_coordoPlumeY3_4;
  GtkWidget *champs_coordoPlumeX3_5,*champs_coordoPlumeY3_6;
  GtkWidget *champs_epaisseur_contour,*champs_couleur_contourR,*champs_couleur_contourG,*champs_couleur_contourB;
  GtkWidget *champs_couleur_fondR,*champs_couleur_fondG,*champs_couleur_fondB;

  GtkWidget * Button_ok;
  GtkWidget *pLabel1,*pLabel2,*pLabel3,*pLabel3_1,*pLabel3_2,*pLabel3_3,*pLabel3_4,
    *pLabel3_5,*pLabel3_6,*pLabel5,*pLabel6,*pLabel7,*pLabel8,*pLabel9,*pLabel10,*pLabel11;

  /*Affichage de la fenetre*/
  pWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  gtk_window_set_title(GTK_WINDOW(pWindow), "Parametrage Plume");
  gtk_window_set_default_size(GTK_WINDOW(pWindow), 150, 100);
  pVBox = gtk_box_new(TRUE, 0);
  gtk_container_add(GTK_CONTAINER(pWindow), pVBox);

  pLabel1 = gtk_label_new("Coordonnees en X : en double");
  pLabel2 = gtk_label_new("Coordonnees en Y : en double");
  pLabel3 = gtk_label_new("Liste de points d'encrage");
  pLabel3_1 = gtk_label_new("Coordonnees en X : en double");
  pLabel3_2 = gtk_label_new("Coordonnees en Y : en double");
  pLabel3_3 = gtk_label_new("Coordonnees en X : en double");
  pLabel3_4 = gtk_label_new("Coordonnees en Y : en double");
  pLabel3_5 = gtk_label_new("Coordonnees en X : en double");
  pLabel3_6 = gtk_label_new("Coordonnees en Y : en double");
  pLabel5 = gtk_label_new("Epaisseur contour : en double");
  pLabel6 = gtk_label_new("Couleur contour R : un double");
  pLabel7 = gtk_label_new("Couleur contour G : un double");
  pLabel8 = gtk_label_new("Couleur contour B : un double");
  pLabel9 = gtk_label_new("Couleur Fond R : un double");
  pLabel10 = gtk_label_new("Couleur Fond G : un double");
  pLabel11 = gtk_label_new("Couleur Fond B : un double");
  
  champs_coordoPlumeX = gtk_entry_new();
  champs_coordoPlumeY = gtk_entry_new();
  champs_coordoPlumeX3_1 = gtk_entry_new();
  champs_coordoPlumeY3_2 = gtk_entry_new();
  champs_coordoPlumeX3_3 = gtk_entry_new();
  champs_coordoPlumeY3_4 = gtk_entry_new();
  champs_coordoPlumeX3_5 = gtk_entry_new();
  champs_coordoPlumeY3_6 = gtk_entry_new();
  champs_epaisseur_contour = gtk_entry_new();
  champs_couleur_contourR = gtk_entry_new();
  champs_couleur_contourG = gtk_entry_new();
  champs_couleur_contourB = gtk_entry_new();
  champs_couleur_fondR = gtk_entry_new();
  champs_couleur_fondG = gtk_entry_new();
  champs_couleur_fondB = gtk_entry_new();

  /*Inclusion des champs de saisie dans la boite*/
  gtk_box_pack_start(GTK_BOX(pVBox),pLabel1, TRUE, FALSE, 0);
  gtk_box_pack_start(GTK_BOX(pVBox),champs_coordoPlumeX, TRUE, FALSE,0);
  
  gtk_box_pack_start(GTK_BOX(pVBox),pLabel2, TRUE, FALSE, 0);
  gtk_box_pack_start(GTK_BOX(pVBox),champs_coordoPlumeY, TRUE, FALSE,0);
  
  gtk_box_pack_start(GTK_BOX(pVBox),pLabel3, TRUE, FALSE, 0);

  /*1er point d'encrage:*/
  gtk_box_pack_start(GTK_BOX(pVBox),pLabel3_1, TRUE, FALSE, 0);
  gtk_box_pack_start(GTK_BOX(pVBox),champs_coordoPlumeX3_1, TRUE, FALSE,0);
  gtk_box_pack_start(GTK_BOX(pVBox),pLabel3_2, TRUE, FALSE, 0);
  gtk_box_pack_start(GTK_BOX(pVBox),champs_coordoPlumeY3_2, TRUE, FALSE,0);
  /*2eme :*/
  gtk_box_pack_start(GTK_BOX(pVBox),pLabel3_3, TRUE, FALSE, 0);
  gtk_box_pack_start(GTK_BOX(pVBox),champs_coordoPlumeX3_3, TRUE, FALSE,0);
  gtk_box_pack_start(GTK_BOX(pVBox),pLabel3_4, TRUE, FALSE, 0);
  gtk_box_pack_start(GTK_BOX(pVBox),champs_coordoPlumeY3_4, TRUE, FALSE,0);
  /*3eme :*/
  gtk_box_pack_start(GTK_BOX(pVBox),pLabel3_5, TRUE, FALSE, 0);
  gtk_box_pack_start(GTK_BOX(pVBox),champs_coordoPlumeX3_5, TRUE, FALSE,0);
  gtk_box_pack_start(GTK_BOX(pVBox),pLabel3_6, TRUE, FALSE, 0);
  gtk_box_pack_start(GTK_BOX(pVBox),champs_coordoPlumeY3_6, TRUE, FALSE,0);
  /*Fin liste points d'encrage*/

  gtk_box_pack_start(GTK_BOX(pVBox),pLabel5, TRUE, FALSE, 0);
  gtk_box_pack_start(GTK_BOX(pVBox),champs_epaisseur_contour, TRUE, FALSE, 0);

  gtk_box_pack_start(GTK_BOX(pVBox),pLabel6, TRUE, FALSE, 0);
  gtk_box_pack_start(GTK_BOX(pVBox),champs_couleur_contourR, TRUE, FALSE, 0);

  gtk_box_pack_start(GTK_BOX(pVBox),pLabel7, TRUE, FALSE, 0);
  gtk_box_pack_start(GTK_BOX(pVBox),champs_couleur_contourG, TRUE, FALSE, 0);

  gtk_box_pack_start(GTK_BOX(pVBox),pLabel8, TRUE, FALSE, 0);
  gtk_box_pack_start(GTK_BOX(pVBox),champs_couleur_contourB, TRUE, FALSE, 0);

  gtk_box_pack_start(GTK_BOX(pVBox),pLabel9, TRUE, FALSE, 0);
  gtk_box_pack_start(GTK_BOX(pVBox),champs_couleur_fondR, TRUE, FALSE, 0);

  gtk_box_pack_start(GTK_BOX(pVBox),pLabel10, TRUE, FALSE, 0);
  gtk_box_pack_start(GTK_BOX(pVBox),champs_couleur_fondG, TRUE, FALSE, 0);

  gtk_box_pack_start(GTK_BOX(pVBox),pLabel11, TRUE, FALSE, 0);
  gtk_box_pack_start(GTK_BOX(pVBox),champs_couleur_fondB, TRUE, FALSE, 0);
  
  Button_ok = gtk_button_new_with_label("OK");
  gtk_box_pack_start(GTK_BOX(pVBox),Button_ok, TRUE, FALSE, 0);

  cr->p = pl;
  cr->Box = pVBox;
  
  /*Appel de la fonction qui remplit la structure marqueur*/
  g_signal_connect(G_OBJECT(Button_ok),"clicked",G_CALLBACK(RemplirStructurePlume),(champ_plume*)cr);
  g_signal_connect(G_OBJECT(Button_ok),"clicked",G_CALLBACK(AppelDessinerPlume),(Plume*)cr->p);

  gtk_widget_show_all(pWindow);
}

/*Fonction qui remplit la structure marqueur qui contient les*/
/*les parametres de la structure plume*/
void RemplirStructurePlume(GtkWidget *pButton,gpointer data)
{
  int i;Coordonnees cor;
  GtkWidget *champs;
  GList *list;
  const gchar *texte_champs;

  Plume * pl;
  champ_plume * cr=(champ_plume*)data;

  pl=cr->p;

  /*Recuperation de la liste des elements que contient la GtkVBox*/
  list = gtk_container_get_children(GTK_CONTAINER((GtkWidget*)cr->Box));
  
  /*Meme principe que pour la structure Rectangle*/
  list = g_list_next(list);
  champs = GTK_WIDGET(list->data);
  texte_champs = gtk_entry_get_text(GTK_ENTRY(champs));
  pl->coorPl.x=atof(texte_champs);

  list = g_list_next(list);
  list = g_list_next(list);
  champs = GTK_WIDGET(list->data);
  texte_champs = gtk_entry_get_text(GTK_ENTRY(champs));
  pl->coorPl.y=atof(texte_champs);

  /*Recuperation des 3 points d'encrage*/
  /*1er*/
  list = g_list_next(list);
  list = g_list_next(list);
  list = g_list_next(list);

  champs = GTK_WIDGET(list->data);
  texte_champs = gtk_entry_get_text(GTK_ENTRY(champs));
  cor.x = atoi(texte_champs);

  list = g_list_next(list);
  list = g_list_next(list);
  champs = GTK_WIDGET(list->data);
  texte_champs = gtk_entry_get_text(GTK_ENTRY(champs));
  cor.y = atoi(texte_champs);
  
  /*Ajout du point dans le tab_dynamique de la structure plume*/
  RajouterPointEncrage(pl,cor);

  /*2eme*/
  list = g_list_next(list);
  list = g_list_next(list);
  champs = GTK_WIDGET(list->data);
  texte_champs = gtk_entry_get_text(GTK_ENTRY(champs));
  cor.x = atoi(texte_champs);

  list = g_list_next(list);
  list = g_list_next(list);
  champs = GTK_WIDGET(list->data);
  texte_champs = gtk_entry_get_text(GTK_ENTRY(champs));
  cor.y = atoi(texte_champs);

  RajouterPointEncrage(pl,cor);

  /*3eme*/
  list = g_list_next(list);
  list = g_list_next(list);
  champs = GTK_WIDGET(list->data);
  texte_champs = gtk_entry_get_text(GTK_ENTRY(champs));
  cor.x = atoi(texte_champs);

  list = g_list_next(list);
  list = g_list_next(list);
  champs = GTK_WIDGET(list->data);
  texte_champs = gtk_entry_get_text(GTK_ENTRY(champs));
  cor.y = atoi(texte_champs);

  RajouterPointEncrage(pl,cor);
  /*Fin ajout point d'encrage*/
  
  list = g_list_next(list);
  list = g_list_next(list);
  champs = GTK_WIDGET(list->data);
  texte_champs = gtk_entry_get_text(GTK_ENTRY(champs));
  pl->epaisseur_contour=atof(texte_champs);

  /*Couleur contour*/
  list = g_list_next(list);
  list = g_list_next(list);
  champs = GTK_WIDGET(list->data);
  texte_champs = gtk_entry_get_text(GTK_ENTRY(champs));
  pl->contour.r=atof(texte_champs);
 
  list = g_list_next(list);
  list = g_list_next(list);
  champs = GTK_WIDGET(list->data);
  texte_champs = gtk_entry_get_text(GTK_ENTRY(champs));
  pl->contour.g=atof(texte_champs);
 
  list = g_list_next(list);
  list = g_list_next(list);
  champs = GTK_WIDGET(list->data);
  texte_champs = gtk_entry_get_text(GTK_ENTRY(champs));
  pl->contour.b=atof(texte_champs);
  
  /*Couleur du fond*/
  list = g_list_next(list);
  list = g_list_next(list);
  champs = GTK_WIDGET(list->data);
  texte_champs = gtk_entry_get_text(GTK_ENTRY(champs));
  pl->fond.r=atof(texte_champs);

  list = g_list_next(list);
  list = g_list_next(list);
  champs = GTK_WIDGET(list->data);
  texte_champs = gtk_entry_get_text(GTK_ENTRY(champs));
  pl->fond.g=atof(texte_champs);

  list = g_list_next(list);
  list = g_list_next(list);
  champs = GTK_WIDGET(list->data);
  texte_champs = gtk_entry_get_text(GTK_ENTRY(champs));
  pl->fond.b=atof(texte_champs);

  /*Calcul de la dimension*/
  pl->dimX = 0;
  pl->dimY = 0;

  for(i=0;i<pl->tab_coordonnees->len;i++)
  {
    pl->dimX = pl->dimX + g_array_index(pl->tab_coordonnees,Coordonnees,i).x;
    pl->dimY = pl->dimY + g_array_index(pl->tab_coordonnees,Coordonnees,i).y;
  }

  g_list_free(list);
}

/*Saisie des  parametres du cercle*/
void boite_saisie_cercle(Cercle * cer)
{
 
  champ_cercle * cr=malloc(sizeof(champ_cercle));
  /*Declaration de la fenetre et de la boite*/
  GtkWidget *pWindow,*pVBox;
  
  /*Champs de saisie des parametres*/
  GtkWidget *champs_coordoCerX,*champs_coordoCerY,*champs_rayon,*champs_epaisseur_contour;
  GtkWidget *champs_couleur_contourR,*champs_couleur_contourG,*champs_couleur_contourB;	
  GtkWidget *champs_couleur_fondR,*champs_couleur_fondG,*champs_couleur_fondB;

  GtkWidget * Button_ok;
  GtkWidget *pLabel1,*pLabel2,*pLabel3,*pLabel4,*pLabel5,*pLabel6,*pLabel7,*pLabel8,*pLabel9,*pLabel10;

  /*Affichage de la fenetre*/
  pWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  gtk_window_set_title(GTK_WINDOW(pWindow), "Parametrage Cercle");
  gtk_window_set_default_size(GTK_WINDOW(pWindow), 150, 100);
  pVBox = gtk_box_new(TRUE, 0);
  gtk_container_add(GTK_CONTAINER(pWindow), pVBox);

  /*** Declaration des champs de saisie *********/
  pLabel1 = gtk_label_new("Coordonnees en X : en double");
  pLabel2 = gtk_label_new("Coordonnees en Y : en double");
  pLabel3 = gtk_label_new("Rayon : en entier");
  pLabel4 = gtk_label_new("Epaisseur contour : en double");
  pLabel5 = gtk_label_new("Couleur contour R : un double");
  pLabel6 = gtk_label_new("Couleur contour G : un double");
  pLabel7 = gtk_label_new("Couleur contour B : un double");
  pLabel8 = gtk_label_new("Couleur Fond R : un double");
  pLabel9 = gtk_label_new("Couleur Fond G : un double");
  pLabel10 = gtk_label_new("Couleur Fond B : un double");
  
  champs_coordoCerX = gtk_entry_new();
  champs_coordoCerY = gtk_entry_new();
  champs_rayon = gtk_entry_new();
  champs_epaisseur_contour = gtk_entry_new();
  champs_couleur_contourR = gtk_entry_new();
  champs_couleur_contourG = gtk_entry_new();
  champs_couleur_contourB = gtk_entry_new();
  champs_couleur_fondR = gtk_entry_new();
  champs_couleur_fondG = gtk_entry_new();
  champs_couleur_fondB = gtk_entry_new();

  /*Inclusion des champs de saisie dans la boite*/
  gtk_box_pack_start(GTK_BOX(pVBox),pLabel1, TRUE, FALSE, 0);
  gtk_box_pack_start(GTK_BOX(pVBox),champs_coordoCerX, TRUE, FALSE, 0);
  
  gtk_box_pack_start(GTK_BOX(pVBox),pLabel2, TRUE, FALSE, 0);
  gtk_box_pack_start(GTK_BOX(pVBox),champs_coordoCerY, TRUE, FALSE, 0);
  
  gtk_box_pack_start(GTK_BOX(pVBox),pLabel3, TRUE, FALSE, 0);
  gtk_box_pack_start(GTK_BOX(pVBox),champs_rayon, TRUE, FALSE, 0);

  gtk_box_pack_start(GTK_BOX(pVBox),pLabel4, TRUE, FALSE, 0);
  gtk_box_pack_start(GTK_BOX(pVBox),champs_epaisseur_contour, TRUE, FALSE, 0);

  gtk_box_pack_start(GTK_BOX(pVBox),pLabel5, TRUE, FALSE, 0);
  gtk_box_pack_start(GTK_BOX(pVBox),champs_couleur_contourR, TRUE, FALSE, 0);

  gtk_box_pack_start(GTK_BOX(pVBox),pLabel6, TRUE, FALSE, 0);
  gtk_box_pack_start(GTK_BOX(pVBox),champs_couleur_contourG, TRUE, FALSE, 0);

  gtk_box_pack_start(GTK_BOX(pVBox),pLabel7, TRUE, FALSE, 0);
  gtk_box_pack_start(GTK_BOX(pVBox),champs_couleur_contourB, TRUE, FALSE, 0);

  gtk_box_pack_start(GTK_BOX(pVBox),pLabel8, TRUE, FALSE, 0);
  gtk_box_pack_start(GTK_BOX(pVBox),champs_couleur_fondR, TRUE, FALSE, 0);

  gtk_box_pack_start(GTK_BOX(pVBox),pLabel9, TRUE, FALSE, 0);
  gtk_box_pack_start(GTK_BOX(pVBox),champs_couleur_fondG, TRUE, FALSE, 0);

  gtk_box_pack_start(GTK_BOX(pVBox),pLabel10, TRUE, FALSE, 0);
  gtk_box_pack_start(GTK_BOX(pVBox),champs_couleur_fondB, TRUE, FALSE, 0);

  Button_ok = gtk_button_new_with_label("OK");
  gtk_box_pack_start(GTK_BOX(pVBox),Button_ok, TRUE, FALSE, 0);

  cr->c = cer;
  cr->Box = pVBox;
  
  /*Appel de la fonction qui remplit la structure marqueur*/
  g_signal_connect(G_OBJECT(Button_ok),"clicked",G_CALLBACK(RemplirStructureCercle),(champ_cercle*)cr);
  g_signal_connect(G_OBJECT(Button_ok),"clicked",G_CALLBACK(AppelDessinerCercle),(Cercle*)cr->c);
  
  gtk_widget_show_all(pWindow);
}

/*Remplissage de la structure Cercle*/
void RemplirStructureCercle(GtkWidget *pButton,gpointer data)
{
  GtkWidget *champs;
  GList *list;
  const gchar *texte_champs;
  Cercle * cer;

  champ_cercle * cr=(champ_cercle*)data;
  cer=cr->c;

  /* Recuperation de la liste des elements que contient la GtkVBox */
  list = gtk_container_get_children(GTK_CONTAINER((GtkWidget*)cr->Box));
  
  /*On recupere les Coordonnes*/
  list = g_list_next(list);
  champs = GTK_WIDGET(list->data);
  texte_champs = gtk_entry_get_text(GTK_ENTRY(champs));
  cer->coordoCer.x=atof(texte_champs);

  list = g_list_next(list);
  list = g_list_next(list);
  champs = GTK_WIDGET(list->data);
  texte_champs = gtk_entry_get_text(GTK_ENTRY(champs));
  cer->coordoCer.y=atof(texte_champs);

  /*On recupere le Rayon*/
  list = g_list_next(list);
  list = g_list_next(list);
  champs = GTK_WIDGET(list->data);
  texte_champs = gtk_entry_get_text(GTK_ENTRY(champs));
  cer->rayon=atof(texte_champs);
 
  /*Epaisseur contour*/
  list = g_list_next(list);
  list = g_list_next(list);
  champs = GTK_WIDGET(list->data);
  texte_champs = gtk_entry_get_text(GTK_ENTRY(champs));
  cer->epaisseur_contour=atof(texte_champs);

  /*Couleur Contour*/
  list = g_list_next(list);
  list = g_list_next(list);
  champs = GTK_WIDGET(list->data);
  texte_champs = gtk_entry_get_text(GTK_ENTRY(champs));
  cer->contour.r=atof(texte_champs);

  list = g_list_next(list);
  list = g_list_next(list);
  champs = GTK_WIDGET(list->data);
  texte_champs = gtk_entry_get_text(GTK_ENTRY(champs));
  cer->contour.g=atof(texte_champs);

  list = g_list_next(list);
  list = g_list_next(list);
  champs = GTK_WIDGET(list->data);
  texte_champs = gtk_entry_get_text(GTK_ENTRY(champs));
  cer->contour.b=atof(texte_champs);

  list = g_list_next(list);
  list = g_list_next(list);
  champs = GTK_WIDGET(list->data);
  texte_champs = gtk_entry_get_text(GTK_ENTRY(champs));
  cer->fond.r=atof(texte_champs);

  list = g_list_next(list);
  list = g_list_next(list);
  champs = GTK_WIDGET(list->data);
  texte_champs = gtk_entry_get_text(GTK_ENTRY(champs));
  cer->fond.g=atof(texte_champs);

  list = g_list_next(list);
  list = g_list_next(list);
  champs = GTK_WIDGET(list->data);
  texte_champs = gtk_entry_get_text(GTK_ENTRY(champs));
  cer->fond.b=atof(texte_champs);

  g_list_free(list);
}

/*Ssaisie des parametres du carre*/
void boite_saisie_carre(Carre * car)
{
  champ_carre * cm=malloc(sizeof(champ_carre));
  /*Declaration de la fenetre et de la boite*/
  GtkWidget *pWindow,*pVBox;
  
  /*Champs de saisie des parametres*/
  GtkWidget *champs_coordoCarX,*champs_coordoCarY,*champs_dim,*champs_epaisseur_contour;
  GtkWidget *champs_couleur_contourR,*champs_couleur_contourG,*champs_couleur_contourB;
  GtkWidget *champs_couleur_fondR,*champs_couleur_fondG,*champs_couleur_fondB;

  GtkWidget * Button_ok;
  GtkWidget *pLabel1,*pLabel2,*pLabel3,*pLabel4,*pLabel5,*pLabel6,*pLabel7,*pLabel8,*pLabel9,*pLabel10;

  /*Affichage de la fenetre*/
  pWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  gtk_window_set_title(GTK_WINDOW(pWindow), "Parametrage Carre");
  gtk_window_set_default_size(GTK_WINDOW(pWindow), 150, 100);
  pVBox = gtk_box_new(TRUE, 0);
  gtk_container_add(GTK_CONTAINER(pWindow), pVBox);

  pLabel1 = gtk_label_new("Coordonnees en X : en double");
  pLabel2 = gtk_label_new("Coordonnees en Y : en double");
  pLabel3 = gtk_label_new("Dimension : en double");
  pLabel4 = gtk_label_new("Epaisseur contour : en double");
  pLabel5 = gtk_label_new("Couleur contour R : un double");
  pLabel6 = gtk_label_new("Couleur contour G : un double");
  pLabel7 = gtk_label_new("Couleur contour B : un double");
  pLabel8 = gtk_label_new("Couleur Fond R : un double");
  pLabel9 = gtk_label_new("Couleur Fond G : un double");
  pLabel10 = gtk_label_new("Couleur Fond B : un double");
  
  champs_coordoCarX = gtk_entry_new();
  champs_coordoCarY = gtk_entry_new();
  champs_dim = gtk_entry_new();
  champs_epaisseur_contour = gtk_entry_new();
  champs_couleur_contourR = gtk_entry_new();
  champs_couleur_contourG = gtk_entry_new();
  champs_couleur_contourB = gtk_entry_new();
  champs_couleur_fondR = gtk_entry_new();
  champs_couleur_fondG = gtk_entry_new();
  champs_couleur_fondB = gtk_entry_new();

  /*Inclusion des champs de saisie dans la boite*/
  gtk_box_pack_start(GTK_BOX(pVBox),pLabel1, TRUE, FALSE, 0);
  gtk_box_pack_start(GTK_BOX(pVBox),champs_coordoCarX, TRUE, FALSE, 0);
  
  gtk_box_pack_start(GTK_BOX(pVBox),pLabel2, TRUE, FALSE, 0);
  gtk_box_pack_start(GTK_BOX(pVBox),champs_coordoCarY, TRUE, FALSE, 0);
  
  gtk_box_pack_start(GTK_BOX(pVBox),pLabel3, TRUE, FALSE, 0);
  gtk_box_pack_start(GTK_BOX(pVBox),champs_dim, TRUE, FALSE, 0);

  gtk_box_pack_start(GTK_BOX(pVBox),pLabel4, TRUE, FALSE, 0);
  gtk_box_pack_start(GTK_BOX(pVBox),champs_epaisseur_contour, TRUE, FALSE, 0);

  gtk_box_pack_start(GTK_BOX(pVBox),pLabel5, TRUE, FALSE, 0);
  gtk_box_pack_start(GTK_BOX(pVBox),champs_couleur_contourR, TRUE, FALSE, 0);

  gtk_box_pack_start(GTK_BOX(pVBox),pLabel6, TRUE, FALSE, 0);
  gtk_box_pack_start(GTK_BOX(pVBox),champs_couleur_contourG, TRUE, FALSE, 0);

  gtk_box_pack_start(GTK_BOX(pVBox),pLabel7, TRUE, FALSE, 0);
  gtk_box_pack_start(GTK_BOX(pVBox),champs_couleur_contourB, TRUE, FALSE, 0);

  gtk_box_pack_start(GTK_BOX(pVBox),pLabel8, TRUE, FALSE, 0);
  gtk_box_pack_start(GTK_BOX(pVBox),champs_couleur_fondR, TRUE, FALSE, 0);

  gtk_box_pack_start(GTK_BOX(pVBox),pLabel9, TRUE, FALSE, 0);
  gtk_box_pack_start(GTK_BOX(pVBox),champs_couleur_fondG, TRUE, FALSE, 0);

  gtk_box_pack_start(GTK_BOX(pVBox),pLabel10, TRUE, FALSE, 0);
  gtk_box_pack_start(GTK_BOX(pVBox),champs_couleur_fondB, TRUE, FALSE, 0);
  
  Button_ok = gtk_button_new_with_label("OK");
  gtk_box_pack_start(GTK_BOX(pVBox),Button_ok, TRUE, FALSE, 0);

  cm->c = car;
  cm->Box = pVBox;
  
  /*Appel de la fonction qui remplit la structure marqueur*/
  g_signal_connect(G_OBJECT(Button_ok),"clicked",G_CALLBACK(RemplirStructureCarre),(champ_carre*)cm);
  g_signal_connect(G_OBJECT(Button_ok),"clicked",G_CALLBACK(AppelDessinerCar),(Carre*)cm->c);
  
  gtk_widget_show_all(pWindow);
}

/*Remplissage de la structure carre*/
void RemplirStructureCarre(GtkWidget *pButton,gpointer data)
{
  GtkWidget *champs;
  GList *list;
  const gchar *texte_champs;
  Carre * car;
  champ_carre * cm=(champ_carre*)data;

  car=cm->c;
  /* Recuperation de la liste des elements que contient la GtkVBox */
  list = gtk_container_get_children(GTK_CONTAINER((GtkWidget*)cm->Box));
  
  /*Recuperation des Coordonnes*/
  list = g_list_next(list);
  champs = GTK_WIDGET(list->data);
  texte_champs = gtk_entry_get_text(GTK_ENTRY(champs));
  car->coordoCar.x=atof(texte_champs);

  list = g_list_next(list);
  list = g_list_next(list);
  champs = GTK_WIDGET(list->data);
  texte_champs = gtk_entry_get_text(GTK_ENTRY(champs));
  car->coordoCar.y=atof(texte_champs);

  /*Recuperation de la dimension*/
  list = g_list_next(list);
  list = g_list_next(list);
  champs = GTK_WIDGET(list->data);
  texte_champs = gtk_entry_get_text(GTK_ENTRY(champs));
  car->dim=atof(texte_champs);
 
  /*Recuperation de l epaisseur du contour*/
  list = g_list_next(list);
  list = g_list_next(list);
  champs = GTK_WIDGET(list->data);
  texte_champs = gtk_entry_get_text(GTK_ENTRY(champs));
  car->epaisseur_contour=atof(texte_champs);

  /*Couleur contour*/
  list = g_list_next(list);
  list = g_list_next(list);
  champs = GTK_WIDGET(list->data);
  texte_champs = gtk_entry_get_text(GTK_ENTRY(champs));
  car->contour.r=atof(texte_champs);

  list = g_list_next(list);
  list = g_list_next(list);
  champs = GTK_WIDGET(list->data);
  texte_champs = gtk_entry_get_text(GTK_ENTRY(champs));
  car->contour.g=atof(texte_champs);

  list = g_list_next(list);
  list = g_list_next(list);
  champs = GTK_WIDGET(list->data);
  texte_champs = gtk_entry_get_text(GTK_ENTRY(champs));
  car->contour.b=atof(texte_champs);

  /*Couleur Fond*/
  list = g_list_next(list);
  list = g_list_next(list);
  champs = GTK_WIDGET(list->data);
  texte_champs = gtk_entry_get_text(GTK_ENTRY(champs));
  car->fond.r=atof(texte_champs);

  list = g_list_next(list);
  list = g_list_next(list);
  champs = GTK_WIDGET(list->data);
  texte_champs = gtk_entry_get_text(GTK_ENTRY(champs));
  car->fond.g=atof(texte_champs);

  list = g_list_next(list);
  list = g_list_next(list);
  champs = GTK_WIDGET(list->data);
  texte_champs = gtk_entry_get_text(GTK_ENTRY(champs));
  car->fond.b=atof(texte_champs);

  g_list_free(list);
}
